接下來四天是一個小單元,我們做一個簡單的小練習,要做一個可以辨識貓狗的模型,用於訓練的資料集是由Kaggle所提供,一個資料分析辨識的競賽平台,不過在Microsoft網站有提供下載,內有解析度不定的貓狗圖片各12500張,請下載然後解壓縮出來,跟你的ipynb檔案放在一起。
使用Colab的同學可以用下列指令下載並解壓縮。
!wget https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_3367a.zip
import zipfile
with zipfile.ZipFile('kagglecatsanddogs_3367a.zip', 'r') as zip:
for i in zip.namelist():
if i.startswith('PetImages'):
zip.extract(i)
本來我們不應該自己手動篩選圖片,應該讓機器自己去挑選,但是這個資料比較少,只是做個練習,請從PetImages裡的Cat資料夾中刪除666.jpg、5673.jpg、Thumbs.db;Dog的部分為11702.jpg、Thumbs.db。
import os
catlist = ['666.jpg', '5673.jpg', 'Thumbs.db']
doglist = ['11702.jpg', 'Thumbs.db']
for i in catlist:
os.remove('PetImages/Cat/' + i)
for i in doglist:
os.remove('PetImages/Dog/' + i)
你可以更改路徑或是驗證集的比例。
img_directory = 'PetImages/'
validation_split = 0.1
使用下列程式碼將圖片隨機分到訓練集或驗證集,執行完之後你的路徑應該變成以下這樣。
PetImages/
train/
Cat/
***.jpg
***.jpg
...
Dog/
***.jpg
***.jpg
...
validation/
Cat/
***.jpg
***.jpg
...
Dog/
***.jpg
***.jpg
...
import os
import random
subclasses = os.listdir(img_directory)
for subclass in subclasses:
os.makedirs(img_directory + 'train/' + subclass, exist_ok=True)
os.makedirs(img_directory + 'validation/' + subclass, exist_ok=True)
for img in os.listdir(img_directory + subclass):
rand = random.choices(['train/', 'validation/'], [1-validation_split, validation_split])[0]
os.rename(img_directory + subclass + '/' + img, img_directory + rand + subclass + '/' + img)
os.rmdir(img_directory + subclass)